package com.example;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * @Component       | 标记类为 Spring Bean          | “我要被扫描注册进 Spring 容器！”
 * @ComponentScan   | 指定扫描的包路径              | “我要去哪里找有 @Component 的类？”
 * 用于标记一个类，让 Spring 能将它作为一个 Bean 注册到容器中。
 * 用于指定 Spring 去哪里“扫描”带有 @Component 注解的类。
 * ✅ 如果不指定 @ComponentScan？
 * 默认会扫描当前类所在包及其所有子包
 * 所以只要你的组件类在 Application 主类所在包或其子包下，不写也能被扫到
 * @Component 是一个元注解，以下注解其实都是 @Component 的变体，用于细分职责：
 * 注解	                含义	                   对应层
 * @Service 业务逻辑组件             Service 层
 * @Repository 数据访问组件             DAO 层
 * @Controller 控制器组件               Web 层
 * @RestController 返回 JSON 的控制器	   Web 层（组合了 @Controller + @ResponseBody）
 * @Component 是标记一个类为 Spring Bean，而 @ComponentScan 是告诉 Spring 去哪些包中扫描这些被标记的类。两者搭配使用，是 Spring 自动装配的基础机制之一。
 * Spring 在注册完一个 Bean 对象后，会自动完成初始化、依赖注入、生命周期回调等一系列操作。你无需手动处理这些逻辑。
 */

/**
 * 在配置类中开启代理暴露功能
 */
@EnableAspectJAutoProxy(exposeProxy = true)
@MapperScan("com.example.mapper")
@SpringBootApplication
public class HmDianpingApplication {

    public static void main(String[] args) {
        SpringApplication.run(HmDianpingApplication.class, args);
    }

}
// 运行配置（Run Configuration）：HmDianpingApplication
// 启动类：HmDianpingApplication.java
// 配置文件：application.yml
// 运行配置与启动类和配置文件绑定
/**
 * 三个项目项，其实都是：
 * 同一个启动类 HmDianpingApplication.java
 * 但在 IntelliJ IDEA 中配置了不同的启动参数
 * 从而使用不同的 yml 文件（通过 profile）加载不同的端口
 * ✔ 虽然它们的名字是 HmDianpingApplication1/2/3，
 * ✔ 但实际上 都是运行同一个类，只是使用不同的配置文件（通过 profile 区分）
 * <p>
 * 同一个启动类 HmDianpingApplication.java 创建的多个运行配置（Run Configuration）副本，每个副本可能设置了不同的端口。
 * 📌 它们本质上运行的代码完全相同，只是启动参数（尤其是端口）不同。
 * 表面上操作一模一样，背后其实是 “运行实例不同，数据行为可同可异”，取决于配置。
 * “多个副本的代码一模一样，但运行环境、配置和状态可能不同，因此用户操作看似一样，实际结果可能存在差异。”
 * <p>
 * 在同一个项目的多个副本启动项中，仅通过配置文件来区分端口（例如 8081、8082、8083），其余配置保持完全一致。
 * 使用主配置文件 application.yml 写通用配置；
 * 为每个副本启动项提供一个独立的 profile，例如 dev1、dev2、dev3；
 * 在 profile-specific 文件中只覆盖端口配置。
 */
